# Python面向对象编程基础：类和对象

"""
1. 类和对象的概念
- 类(Class)：是一个抽象的概念，定义了一类事物的共同特征和行为
- 对象(Object)：是类的具体实例，拥有类中定义的所有特征和行为
比如人类就是一个类，而具体的你、我就是人类的其中一个对象

为什么要面向对象？
- 更好地模拟现实世界
- 代码更容易维护和复用
- 数据和行为封装在一起，更安全和清晰
"""

# 2. 定义一个简单的类
# 注意，类名通常采用驼峰命名法，首字母大写
class Student:
    # 使用pass表示类暂时不需要任何方法
    pass

# 创建类的实例（对象）
student1 = Student()  # 创建一个Student类的实例
student2 = Student()  # 创建另一个Student类的实例

print("student1和student2是Student类的两个不同实例：")
print(f"student1的内存地址：{id(student1)}")
print(f"student2的内存地址：{id(student2)}")


# 3. 类属性示例
class School:
    # 类属性：直接在类中定义的属性，被所有实例共享
    school_name = "Python编程学校"  # 这是一个类属性
    student_count = 0  # 这也是一个类属性

# 创建School类的实例
school1 = School()
school2 = School()

# 通过类名访问类属性
print(f"\n通过类名访问类属性：{School.school_name}")

# 通过实例访问类属性
print(f"通过school1实例访问类属性：{school1.school_name}")
print(f"通过school2实例访问类属性：{school2.school_name}")

# 修改类的类属性，所有实例都会受到影响
School.school_name = "Python高级编程学校"
print("\n修改后的类属性值：")
print(f"通过类名访问：{School.school_name}")
print(f"通过实例访问：{school1.school_name}")

# 修改对象的类属性，只会影响当前对象
school1.school_name = "Python基础编程学校"
print("\n修改对象的类属性：")
print(f"通过类名访问：{School.school_name}")
print(f"通过实例访问1：{school1.school_name}")
print(f"通过实例访问2：{school2.school_name}")

"""
类和对象的关系就像是模具和产品的关系：
- 类（模具）定义了对象的特征和行为
- 对象（产品）是类的具体实例

类属性的特点：
- 在类中直接定义
- 被所有实例共享
- 可以通过类名或实例访问
- 修改类的类属性会影响所有实例，修改实例的类属性只会影响当前实例
（相当于每个模具都定义了这个产品的一些属性，比如长宽高；具体到某个产品，会继承这些属性，也可以走出这个产品自己的路子）
（比如人类通常只能在陆地上行走，是无法自己飞行的，会飞=False；但是有些鸟人与众不同，拥有会飞=True的属性，所以可以飞起来）
"""